共计 3004 个字符,预计需要花费 8 分钟才能阅读完成。
snake.py
from turtle import Turtle | |
STARTING_POSITIONS = [(0, 0), (-20, 0), (-40, 0)] | |
MOVE_DISTANCE = 20 | |
UP = 90 | |
DOWN = 270 | |
LEFT = 180 | |
RIGHT = 0 | |
class Snake: | |
def __init__(self): | |
self.segments = [] | |
self.create_snake() | |
self.head = self.segments[0] | |
def create_snake(self): | |
for position in STARTING_POSITIONS: | |
self.add_segment(position) | |
def add_segment(self, position): | |
new_segment = Turtle("square") | |
new_segment.color("white") | |
new_segment.penup() | |
new_segment.goto(position) | |
self.segments.append(new_segment) | |
def extend(self): | |
self.add_segment(self.segments[-1].position()) | |
def move(self): | |
for seg_num in range(len(self.segments) - 1, 0, -1): | |
new_x = self.segments[seg_num - 1].xcor() | |
new_y = self.segments[seg_num - 1].ycor() | |
self.segments[seg_num].goto(new_x, new_y) | |
self.head.forward(MOVE_DISTANCE) | |
def up(self): | |
if self.head.heading() != DOWN: | |
self.head.setheading(UP) | |
def down(self): | |
if self.head.heading() != UP: | |
self.head.setheading(DOWN) | |
def left(self): | |
if self.head.heading() != RIGHT: | |
self.head.setheading(LEFT) | |
def right(self): | |
if self.head.heading() != LEFT: | |
self.head.setheading(RIGHT) |
food.py
from turtle import Turtle | |
import random | |
class Food(Turtle): | |
def __init__(self): | |
super().__init__() | |
self.shape("circle") | |
self.penup() | |
self.shapesize(stretch_len=0.5, stretch_wid=0.5) | |
self.color("blue") | |
self.speed("fastest") | |
self.refresh() | |
def refresh(self): | |
random_x = random.randint(-280, 280) | |
random_y = random.randint(-280, 280) | |
self.goto(random_x, random_y) |
scoreboard.py
from turtle import Turtle | |
ALIGNMENT = "center" | |
FONT = ("Courier", 24, "normal") | |
class Scoreboard(Turtle): | |
def __init__(self): | |
super().__init__() | |
self.score = 0 | |
with open("data.txt") as data: | |
self.high_score = int(data.read()) | |
self.color("white") | |
self.penup() | |
self.goto(0, 270) | |
self.hideturtle() | |
self.update_scoreboard() | |
def update_scoreboard(self): | |
self.clear() | |
self.write(f"Score: {self.score} High Score: {self.high_score}", align=ALIGNMENT, font=FONT) | |
def reset(self): | |
if self.score > self.high_score: | |
self.high_score = self.score | |
with open("data.txt", mode="w") as data: | |
data.write(f"{self.high_score}") | |
self.score = 0 | |
self.update_scoreboard() | |
def increase_score(self): | |
self.score += 1 | |
self.update_scoreboard() | |
def game_over(self): | |
self.goto(0, 0) | |
self.write("GAME OVER", align=ALIGNMENT, font=FONT) | |
self.reset() |
main.py
from turtle import Screen | |
from snake import Snake | |
from food import Food | |
from scoreboard import Scoreboard | |
import time | |
screen = Screen() | |
screen.setup(width=600, height=600) | |
screen.bgcolor("black") | |
screen.title("My Snake Game") | |
screen.tracer(0) | |
snake = Snake() | |
food = Food() | |
scoreboard = Scoreboard() | |
screen.listen() | |
screen.onkey(snake.up, "Up") | |
screen.onkey(snake.down, "Down") | |
screen.onkey(snake.left, "Left") | |
screen.onkey(snake.right, "Right") | |
game_is_on = True | |
while game_is_on: | |
screen.update() | |
time.sleep(0.1) | |
snake.move() | |
# Detect collision with food. | |
if snake.head.distance(food) < 15: | |
food.refresh() | |
snake.extend() | |
scoreboard.increase_score() | |
# Detect collision with wall. | |
if snake.head.xcor() > 280 or snake.head.xcor() < -280 or snake.head.ycor() > 280 or snake.head.ycor() < -280: | |
game_is_on = False | |
scoreboard.game_over() | |
# Detect collision with tail. | |
for segment in snake.segments: | |
if segment == snake.head: | |
pass | |
elif snake.head.distance(segment) < 10: | |
game_is_on = False | |
scoreboard.game_over() | |
screen.exitonclick() |
data.txt
0
正文完